package com.ldk.base.framework.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public interface IBaseService<T extends Serializable> {
	/**
	 * 获取ID最大值
	 * @return
	 */
	public Object getMaxId(String dbKey);
	/**
	 * 
	 * @param query
	 * @return
	 */
	public Boolean exist(String dbKey, T query);
	/**
	 * 单条数据查询
	 * @param query
	 * @return
	 */
	public <V extends T> V selectOne(String dbKey, T query);

	/**
	 * 单条数据查询
	 * @param query
	 * @return
	 */
	public <V extends T> V selectOne(String dbKey, Map<String,Object> query);
	
	/**
	 * 单条数据查询（排序）
	 * @param query 查询条件
	 * @param sort 排序
	 * @return
	 * @throws Exception
	 */
	public <V extends T> V selectOne(String dbKey, T query, Sort sort);
	
	/**
	 * 根据主键查询
	 * @param key
	 * @return
	 */
	public <V extends T> V selectByKey(String dbKey, T query);
	
	/**
	 * 多条数据查询
	 * @param query
	 * @return
	 */
	public <V extends T> List<V> selectList(String dbKey, T query);

	public <V extends T> List<V> selectListUpper(String dbKey, T query);

	/**
	 * 多条数据查询（排序）
	 * @param query 查询条件
	 * @param sort 排序
	 * @return
	 * @throws Exception
	 */
	public <V extends T> List<V> selectList(String dbKey, T query, Sort sort);
	
	/**
	 * 所有查询
	 * @return
	 */
	public <V extends T> List<V> selectAll(String dbKey);
	
	/**
	 * 分页查询
	 * @param query
	 * @param pageable
	 * @return
	 */
	public <V extends T> List<V> selectList(String dbKey, T query, Pageable pageable);
	/**
	 * 分页查询
	 * @param query
	 * @param pageable
	 * @return
	 */
	public <V extends T> Page<V> selectPageList(String dbKey, T query, Pageable pageable);
	/**
	 * 
	 * @param query
	 * @param mapKey
	 * @return Map
	 */
	public <K, V> Map<K, V> selectMap(String dbKey, T query, String mapKey);
	/**
	 * 多条数据查询（排序）
	 * @param query 查询条件
	 * @param mapKey
	 * @param sort 排序
	 * @return
	 * @throws Exception
	 */
	public <K, V> Map<K, V> selectMap(String dbKey, T query,String mapKey, Sort sort);
	
	/**
	 * 
	 * @param query
	 * @param pageable
	 * @param mapKey
	 * @return Map
	 */
	public <K, V> Map<K, V> selectMap(String dbKey, T query, Pageable pageable, String mapKey);
	
	/**
	 * 查询总条数
	 * @return
	 */
	public Long selectCount(String dbKey);
	/**
	 * 条件查询总条数
	 * @param query
	 * @return
	 */
	public Long selectCount(String dbKey, T query);
	/**
	 * 添加
	 * @param entity
	 */
	public int insert(String dbKey, T entity);

	/**
	 * 添加
	 * @param entity
	 */
	public int insertUpper(String dbKey, T entity);
	/**
	 * 添加并获取自增主键ID值
	 * @return
	 */
	public long insertAndGetAutoIncrementId(String dbKey, T entity, String keyField);
	/**
	 * 删除
	 * @param query
	 * @return
	 */
	public int delete(String dbKey, T query);
	/**
	 * 根据主键删除
	 * @param key
	 * @return
	 */
	public int deleteByKey(String dbKey, T query);
	/**
	 * 删除所有
	 * @return 
	 */
	public int deleteAll(String dbKey);
	/**
	 * 根据主键修改
	 * @param dbKey
	 * @param key
	 * @return
	 */
	public int updateByKey(String dbKey,T entity);

	/**
	 * 根据主键修改
	 * @param dbKey
	 * @param entity
	 * @return
	 */
	public int updateUpperByKey(String dbKey,T entity);

	/**
	 * 修改
	 * @param entity
	 * @return
	 */
	public int update(String dbKey, T entity);

	/**
	 * 生成指定位数n的随机数
	 * 生成6位司机ID 或 8位乘客ID
	 * @param n
	 * @return
	 */
	public long generateID(long n);



}
